package com.shujia.day10;

import java.util.ArrayList;
import java.util.Collection;

public class Code12CollectionOperator {
    public static void main(String[] args) {
        /*
            从Java API中可以看到 Collection 为一个接口，并且定义了很多容器相关的抽象方法
            为什么Collection是一个接口而不是一个抽象类？
                接口的作用：主要是提供一个规范，如果要完成相关的功能，必须要对当前接口中的抽象方法进行重写，
                    而重写是对方法名 方法参数 返回值不能做修改 根据不同应用场景对应不同的容器比如List Set,
                        在根据不同场景的功能，对对应的方法进行定义不同的处理逻辑
                而Collection的子接口中有List Set常见容器，
                    List描述是一个有序的集合容器
                    Set是一个不重复的无序容器
                根据容器不同的特点，在List接口中又定义了相关的接口规范，比如对元素进行排序
                    List中包含有ArrayList Vector LinkedList 根据具体的容器，其排序方式不一样，所以排序函数需要分别实现
                        同时也可以解释List为什么是一个接口，而不是一个抽象类

              注意：
                在Java中的容器，一般情况下，只添加统一类型的数据
         */

        // 如果要使用Collection中定义的抽象方法，那么以ArrayList为例 创建对象
        //  根据多态，将实现类的对象赋予给接口
        Collection collection = new ArrayList();


        /*
            Collection中的方法;
                boolean add(E e)
                    // add 可以添加一个Object对象（任意一个对象）但是取数据时，由于Java是一个静态数据类型语言，所以遍历结果会出错
                boolean remove(Object o)
                void clear()
                boolean contains(Object o)  // 是否包含一个对象
                boolean isEmpty()
                int size()  // 看当前集合中存在有多少元素

         */
        StudentArr studentArr = new StudentArr("曹聪", 18);
        collection.add(studentArr);
        collection.add(new Student("柏杨","23"));
        int i = 1;
        collection.add(i); // 自动装箱成一个包装类
        collection.add(1);

        // 通过增强for的形式对对象进行遍历
//        for (Object obj : collection) {
//            StudentArr stu  = (StudentArr)obj;
//            System.out.println(stu);
//        }

        System.out.println(collection.size());
        collection.remove(i);  // 成功
        System.out.println(collection.size());


        /*
             new ArrayList()：当前Collection的对象是 ArrayList 根据多态 编译看左运行看右
                那么如果要查看contains方法，那么需要到ArrayList中查看 从该类中可以看出 contains 方法
                    底层源码实际上是调用对象的equals方法进行对集合中每个对象进行比较

             注意：
                如果要使用contain比较对象，需要重写equals方法，并且对象类中 既有无参构造 也要有有参构造

         */

        if (collection.contains(studentArr)) {
            System.out.println("集合中包含有该对象："+studentArr);
        }

        if(!collection.contains(new Student("柏杨","23"))){
            System.out.println("集合中不包含有该对象："+new Student("柏杨","23"));
        }else{
            System.out.println("集合中包含有该对象："+new Student("柏杨","23"));
        }


        collection.clear(); // 清空当前的集合
        if (collection.isEmpty()) {
            System.out.println("集合中不包含有任何数据..");
        }



    }
}
